#ifndef CONTROLADORCONEXIONES_H_
#define CONTROLADORCONEXIONES_H_

#include <algorithm>
#include <fstream>
#include <vector>

#include "ControladorCliente.h"

#define LOG_CONTROLADOR	"controlador.log"

#define MENSAJE_INGRESO " ha ingresado al juego"
#define MENSAJE_ABANDONO " ha abandonado el juego"

using namespace std;

class ControladorConexiones {

	int cantidadJugadores;
	string nombreGanador;
	
	pthread_t thread;
	
	vector<ControladorCliente*> conexiones;
	pthread_mutex_t mutexConexiones;
	
	vector<bool> personajesHabilitados;
	pthread_mutex_t mutexPersonajesHabilitados;
	
	EstadoJuego estado;
	pthread_mutex_t mutexEstado;
	
	public:
	
		std::ofstream log_controlador;
	
		ControladorConexiones(int cantidadJugadores);
		~ControladorConexiones();
		
		void ComenzarControl(void* datos, void* funcion(void*));
		void ComenzarJuego();
		void ManejarEstados();
		
		bool AgregarConexion(ControladorCliente* cliente);
		void DesactivarConexion(ControladorCliente* conexion);
		unsigned int CantidadConexiones();
		void setNombreGanador(string nombre);
		
		EstadoJuego getEstadoJuego();
		void setEstadoJuego(EstadoJuego estado);
		pthread_t getThread();
		
		bool OcuparPersonaje(int tipoPersonaje);
		void AgregarConexionLista();
		
		void DesocuparPersonaje(int tipoPersonaje);
		vector< pair<int, TipoPersonaje*> > InfoPersonajesHabilitados();
		
		int getCantidadJugadores();
		bool ListoParaEmpezar();
		
		void LockConexiones();
		void UnlockConexiones();
		
		vector<Personaje*> getPersonajes();
		void LockPersonajes();
		void UnlockPersonajes();
		
		void setPaquetes(string mensajePersonajes, string mensajeObstaculos, string mensajePuntajes);
		void setSonidos(string mensajeSonidos);
		void CongelarPosiciones();
		
};

#endif /* CONTROLADORCONEXIONES_H_ */